package com.w7vm.menuweb.managerBean;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.Application;
import javax.faces.application.ViewHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;

import javax.ejb.EJB;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.PersistenceException;

import org.primefaces.component.inputtext.InputText;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

import sun.text.resources.FormatData;

import com.w7vm.componente.ws.Webservicecep;
import com.w7vm.menuweb.entity.AcessoWeb;
import com.w7vm.menuweb.entity.RestauranteCulinariaSy;
import com.w7vm.menuweb.entity.RestauranteEstruturaSy;
import com.w7vm.menuweb.entity.RestauranteFilialEnderecoWeb;
import com.w7vm.menuweb.entity.RestauranteFilialInfraestruturaWeb;
import com.w7vm.menuweb.entity.RestauranteFilialJuridicoWeb;
import com.w7vm.menuweb.entity.RestauranteFilialWeb;
import com.w7vm.menuweb.entity.RestauranteSedeWeb;
import com.w7vm.menuweb.entity.RestauranteServicoSy;
import com.w7vm.menuweb.entity.RestauranteTipoSy;
import com.w7vm.menuweb.entity.UsuarioWeb;
import com.w7vm.menuweb.facade.AcessoFacade;
import com.w7vm.menuweb.facade.CorreioFacade;
import com.w7vm.menuweb.facade.RestauranteCulinariaFacade;
import com.w7vm.menuweb.facade.RestauranteEstruturaFacade;
import com.w7vm.menuweb.facade.RestauranteFilialFacade;
import com.w7vm.menuweb.facade.RestauranteSedeFacade;
import com.w7vm.menuweb.facade.RestauranteServicoFacade;
import com.w7vm.menuweb.facade.RestauranteTipoFacade;
import com.w7vm.menuweb.message.MessageFaces;
import com.w7vm.menuweb.utility.Constantes;
import com.w7vm.menuweb.utility.PropertiesLoaderImpl;

@ManagedBean
@ViewScoped
public class RestauranteFilialMB implements Serializable{

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@EJB
	private RestauranteFilialFacade filialEJB;
	private RestauranteFilialWeb filialEntity = new RestauranteFilialWeb();
	private RestauranteFilialEnderecoWeb filialEnderecoEntity = new RestauranteFilialEnderecoWeb();
	private RestauranteFilialJuridicoWeb filialJuridicoEntity = new RestauranteFilialJuridicoWeb();
	private RestauranteFilialInfraestruturaWeb filialInfraEntity = new RestauranteFilialInfraestruturaWeb(); 

	private UsuarioWeb usuarioEntity = new UsuarioWeb();

	@EJB
	private RestauranteSedeFacade sedeEJB;
	private RestauranteSedeWeb sedeEntity = new RestauranteSedeWeb();

	@EJB
	private RestauranteCulinariaFacade restauranteCulinariaEJB;
	private RestauranteCulinariaSy culinariaEntity = new RestauranteCulinariaSy();
	
	@EJB
	private RestauranteTipoFacade restauranteTipoEJB;
	private RestauranteTipoSy tipoEntity = new RestauranteTipoSy();
	
	@EJB
	private RestauranteServicoFacade restauranteServicoEJB;
	private RestauranteServicoSy servicoEntity = new RestauranteServicoSy();
	
	@EJB
	private RestauranteEstruturaFacade restauranteEstruturaEJB;
	private RestauranteEstruturaSy estruturaEntity = new RestauranteEstruturaSy();
	
	@EJB
	private CorreioFacade correioEJB;
	private Webservicecep enderecoWS = new Webservicecep();

	@EJB
	private AcessoFacade acessoEJB;
	private AcessoWeb acessoEntity = new AcessoWeb();

	private MessageFaces message = new MessageFaces();
	
	// PickerList ---- Usuario x Filial
	private List<RestauranteFilialWeb> filiaisSource = new ArrayList<RestauranteFilialWeb>();
	private List<RestauranteFilialWeb> filiaisTarget = new ArrayList<RestauranteFilialWeb>();
	private DualListModel<RestauranteFilialWeb> filiais;
	
	// PickerList ---- Estrutura
	private DualListModel<RestauranteEstruturaSy> estruturaPickerView;
	private List<RestauranteEstruturaSy> source = new ArrayList<RestauranteEstruturaSy>();  
	private List<RestauranteEstruturaSy> target = new ArrayList<RestauranteEstruturaSy>(); 

	private LoginMB loginObj = new LoginMB();
	private String cep;
	private Constantes constantesObj = new Constantes();
	private InputText inputTextCEP = new InputText();

	
	
//=====================================METHOD - PERSISTIR RESTAURANTE-FILIAL ===================================================================	
	
	public void salvarRestauranteFilial(){
			System.out.println("salvarRestauranteFilial()  "+ filialEntity);
			
			if(validaDados() == false){
				try{
					
					preparaEntityRestauranteFilial();
					preparaEntityRestauranteFilialEndereco();
					
					// Recupera IDRestaurante Sede
					int idSede = (Integer) loginObj.getSessao("IDSede");
					System.out.println("idSede...................."+ idSede);
					sedeEntity.setIdRestauranteSedeWeb(idSede);
					filialEntity.setRestauranteSedeWeb(sedeEntity);

					if(getTarget().size() > 0){
						preparaEntityRestauranteFilialInfraestrutura();
						filialInfraEntity.setRestauranteFilialWeb(filialEntity);
					}

					filialEnderecoEntity.setRestauranteFilialWeb(filialEntity);
					filialJuridicoEntity.setRestauranteFilialWeb(filialEntity);
					filialEntity = filialEJB.saveRestauranteFilial(filialEntity);
					
					// Persiste Entidade AcessoWeb
					int idUsuario = (Integer) loginObj.getSessao("IDUsuario");
					System.out.println("idUsuario...................."+ idUsuario);
					usuarioEntity.setIdUsuarioWeb(idUsuario);
					acessoEntity.setStatus(constantesObj.ATIVO);
					acessoEntity.setRestauranteSedeWeb(sedeEntity);
					acessoEntity.setUsuarioWeb(usuarioEntity);
					acessoEntity.setRestauranteFilialWeb(filialEntity);
					acessoEntity.setPerfil(constantesObj.PERFIL_ADMIN_CONTA);
					acessoEntity.setAcessoFilial(constantesObj.ACESSO_FILIAL_SIM);
					acessoEJB.saveAcesso(acessoEntity);

					// Menssage Sucesso Persiste
					try {
						String msgTitulo = PropertiesLoaderImpl.getValor("tSuccessCadEmpresaFilial");
						message.sendInfoMessageToUser(msgTitulo, "");

						filialEntity = new RestauranteFilialWeb();
						filialJuridicoEntity = new RestauranteFilialJuridicoWeb();
						filialEnderecoEntity = new RestauranteFilialEnderecoWeb();
						filialInfraEntity = new RestauranteFilialInfraestruturaWeb();
						culinariaEntity = new RestauranteCulinariaSy();
						estruturaEntity = new RestauranteEstruturaSy();
						servicoEntity = new RestauranteServicoSy();
						tipoEntity = new RestauranteTipoSy();
						setCep("");
						enderecoWS = new Webservicecep();

						FacesContext.getCurrentInstance().getExternalContext().redirect("../admin/cadRestauranteFilial.jsf");
						// Nova Instancia Objetos
					} catch (IOException e) {
						e.printStackTrace();
					}
					
				} catch (PersistenceException e) {
					e.printStackTrace();
					String msgTitulo = PropertiesLoaderImpl.getValor("tErroCadEmpresaFilial");
					message.sendErrorMessageToUser(msgTitulo, "");
				}
			}
			else{
				redirecionaPaginaCadFilial();
			}
	}
			
/*================= VALIDA DADOS ==============================================================*/
	
	public void redirecionaPaginaCadFilial(){
	        FacesContext context = FacesContext.getCurrentInstance();  
	        Application application = context.getApplication();  
	        ViewHandler viewHandler = application.getViewHandler();  
	        UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());  
	        context.setViewRoot(viewRoot);  
	        context.renderResponse(); 
	}
		
	public boolean validaDados(){
			System.out.println("validaDadosLocalidade()");
			boolean statusValida = false;
			
			if(!filialJuridicoEntity.getCnpj().equals("")){
				
				// Check o Formato CNPJ Filial, deve estar igual ao da Empresa Sede
				String cnpjSede = (String) loginObj.getSessao("cnpj");
				cnpjSede = cnpjSede.substring(0,8);
				System.out.println("TOKEN................"+ cnpjSede);
				
				String cnpjFilial = filialJuridicoEntity.getCnpj();
				cnpjFilial = cnpjFilial.substring(0,8);
				System.out.println("TOKEN................"+ cnpjFilial);

				
				if(!cnpjSede.equals(cnpjFilial)){
					
					String cnpjFormat = (String) loginObj.getSessao("cnpj");
					String cnpjFormat1 = cnpjFormat.substring(0,2);
					String cnpjFormat2 = cnpjFormat.substring(2,5);
					String cnpjFormat3 = cnpjFormat.substring(5,8);
					String cnpjFormat4 = cnpjFormat.substring(8,12);
					String cnpjFormat5 = cnpjFormat.substring(12,14);
					cnpjFormat = cnpjFormat1+"."+cnpjFormat2+"."+cnpjFormat3+"/"+cnpjFormat4+"-"+cnpjFormat5; 
					String msg = PropertiesLoaderImpl.getValor("tErroCNPJDiferenteSede");
					message.sendErrorMessageToUser(msg,cnpjFormat);
					redirecionaPaginaCadFilial();
					return statusValida = true;
				}
				
				// Check se o CNPJ encontra-se cadastrado Restaurante - SEDE  table Sede 
				List<RestauranteSedeWeb> sedeObjL = null;
				sedeObjL = sedeEJB.findRestauranteSedeByCNPJ(filialJuridicoEntity.getCnpj());
				if(sedeObjL.size() > 0){
					String msg = PropertiesLoaderImpl.getValor("tErroCNPJSedeExiste");
					message.sendErrorMessageToUser(msg,null);
					redirecionaPaginaCadFilial();
					return statusValida = true;
				}
				//Check se o CNPJ encontra-se cadastrado Restaurante - FILIAL table Filial
				List<RestauranteFilialWeb> filialObjL = null;
				filialObjL = filialEJB.findRestauranteFilialByCNPJ(filialJuridicoEntity.getCnpj());
				if(filialObjL.size() > 0){
					String msg = PropertiesLoaderImpl.getValor("tErroCNPJFilialExiste");
					message.sendErrorMessageToUser(msg,null);
					redirecionaPaginaCadFilial();
					return statusValida = true;
				}
				
			}
			else{
				String msg = PropertiesLoaderImpl.getValor("tErroCNPJ");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return statusValida = true;
			}
			
			if(enderecoWS.getLogradouro().equals("") ||
				enderecoWS.getLogradouro()== null){
					System.out.println("enderecoWS.getLogradouro() NULL");
					String msg = PropertiesLoaderImpl.getValor("tErroEndereco");
					message.sendErrorMessageToUser(msg,null);
					redirecionaPaginaCadFilial();
					return statusValida = true;
			}
			
			if(enderecoWS.getBairro().equals("") ||
					enderecoWS.getBairro() == null){
			
				System.out.println("enderecoWS.getBairroPrepara () NULL");
				String msg = PropertiesLoaderImpl.getValor("tErroBairro");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;

			}
			
			if(filialEnderecoEntity.getNumero() == 0){
			
				System.out.println("endFilialEntity.getNumero() 0");
				String msg = PropertiesLoaderImpl.getValor("tErroNumero");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;

			}
			
			if(enderecoWS.getCidade().equals("") ||
					enderecoWS.getCidade()== null){
				String msg = PropertiesLoaderImpl.getValor("tErroCidade");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return statusValida = true;
			}
			
			if(enderecoWS.getUf().equals("") ||
					enderecoWS.getUf() == null){
				String msg = PropertiesLoaderImpl.getValor("tErroUF");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}
			
			if(filialEntity.getProprietario() == "" ||
			filialEntity.getProprietario() == null){
				String msg = PropertiesLoaderImpl.getValor("tErroProprietario");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}

			if(filialEntity.getMail() == "" ||
					filialEntity.getMail() == null){
				String msg = PropertiesLoaderImpl.getValor("tErroMail");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}

			if(filialEntity.getFone1() == "" ||
					filialEntity.getFone1() == null){
				String msg = PropertiesLoaderImpl.getValor("tErroFone1");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}
			
			if(tipoEntity.getIdRestauranteTipoSys() == 0){
				String msg = PropertiesLoaderImpl.getValor("tErroTipo");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}

			if(culinariaEntity.getIdRestauranteCulinariaSys() == 0){
				String msg = PropertiesLoaderImpl.getValor("tErroCulinaria");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}

			if(servicoEntity.getIdRestauranteServicoSys() == 0){
				String msg = PropertiesLoaderImpl.getValor("tErroServico");
				message.sendErrorMessageToUser(msg,null);
				redirecionaPaginaCadFilial();
				return  statusValida = true;
			}
			return statusValida;
	}

		
		
	
/*==================Prepara entidade persistencia ===================================================================================================*/
 
		
	public void preparaEntityRestauranteFilial()
	{
		filialEntity.setRestauranteCulinariaSy(culinariaEntity);
		filialEntity.setRestauranteTipoSy(tipoEntity);
		filialEntity.setRestauranteServicoSy(servicoEntity);
		Date dtnow = new Date();
		filialEntity.setDataInc(dtnow);
		filialEntity.setRestauranteFilialJuridicoWeb(filialJuridicoEntity);
		
	}
	
	public void preparaEntityRestauranteFilialEndereco()
	{
		Set<RestauranteFilialEnderecoWeb> endFilialL = new HashSet<RestauranteFilialEnderecoWeb>();

		//setCep((String)inputTextCEP.getSubmittedValue());
		setCep((String) loginObj.getSessao("cep"));
		System.out.println("CEP "+  getCep());
		
		//filialEnderecoEntity.setCep((String)inputTextCEP.getSubmittedValue());
		filialEnderecoEntity.setCep(getCep());
		filialEnderecoEntity.setCidade(enderecoWS.getCidade());
		filialEnderecoEntity.setLogradouro(enderecoWS.getLogradouro());
		filialEnderecoEntity.setBairro(enderecoWS.getBairro());	
		filialEnderecoEntity.setEstado(enderecoWS.getUf());	
		endFilialL.add(filialEnderecoEntity);
		filialEntity.setRestauranteFilialEnderecoWebs(endFilialL);
	}

	public void preparaEntityRestauranteFilialInfraestrutura()
	{
		Set<RestauranteFilialInfraestruturaWeb> infraFilialL = new HashSet<RestauranteFilialInfraestruturaWeb>();
		RestauranteEstruturaSy restEstSYS = new RestauranteEstruturaSy(); 
		
		System.out.println("Tamanho List TARGET()  "+ getTarget().size());
		
		for(RestauranteEstruturaSy est : getTarget()){
			restEstSYS.setIdRestauranteEstruturaSys(est.getIdRestauranteEstruturaSys());
			filialInfraEntity.setRestauranteEstruturaSy(restEstSYS);
			filialInfraEntity.setRestauranteFilialWeb(filialEntity);
			infraFilialL.add(filialInfraEntity);
			System.out.println("Tamanho List infraFilialL  "+ infraFilialL.size());
			filialInfraEntity = new RestauranteFilialInfraestruturaWeb();
			restEstSYS = new RestauranteEstruturaSy(); 
		}
		
		filialEntity.setRestauranteFilialInfraestruturaWebs(infraFilialL);
	
	}
	
/*======================================================== METHOD LOAD TAblE SYS ===========================================================*/
	
	
	public List<RestauranteCulinariaSy> loadCulinariaRestaurante(){
		return restauranteCulinariaEJB.findCulinariaRestauranteByAll();
	}
	
	public List<RestauranteServicoSy> loadServicoRestaurante(){
		return restauranteServicoEJB.findServicoRestauranteByAll();

	}
	
	public List<RestauranteTipoSy> loadTipoRestaurante(){
		return restauranteTipoEJB.findTipoRestauranteByAll();
	}

/*============================== PICKER VIEW - ESTRUTURA  ============================================================================*/

	/* Entity: RestauranteEstruturaSy
	 * Functionality: Load table RestauranteEstruturaSy to fiel  
	 */
	public List<RestauranteEstruturaSy> loadEstruturaRestaurante(){
        source  = restauranteEstruturaEJB.findEstruturaRestauranteByAll();
        estruturaPickerView = new DualListModel<RestauranteEstruturaSy>(source,target);
		return source;
	}
	
    public void onTransfer(TransferEvent event) {  
        StringBuilder builder = new StringBuilder();
        for(Object item : event.getItems()) {  
            builder.append(((RestauranteEstruturaSy) item).getEstrutura()).append("<br />");
        }  
    }  
    
	public DualListModel<RestauranteEstruturaSy> getEstruturaPickerView() {
		loadEstruturaRestaurante();
		return estruturaPickerView;
	}

	public void setEstruturaPickerView(
			DualListModel<RestauranteEstruturaSy> estruturaPickerView) {
		this.estruturaPickerView = estruturaPickerView;
	}
	
	public List<RestauranteEstruturaSy> getSource() {
		return source;
	}

	public void setSource(List<RestauranteEstruturaSy> source) {
		this.source = source;
	}

	public List<RestauranteEstruturaSy> getTarget() {
		System.out.println("estruturaPickerView.getTarget()  "+ estruturaPickerView.getTarget());

		return estruturaPickerView.getTarget();
	}

	public void setTarget(List<RestauranteEstruturaSy> target) {
		this.target = target;
	}
	   

/*============================ LOAD CORREIO-WS ========================================================================*/


	public void loadEnderecoCorreios(){
		System.out.println("loadEnderecoCorreios()"+ inputTextCEP.getSubmittedValue());

		setCep((String)inputTextCEP.getSubmittedValue());
		
		System.out.println("loadEnderecoCorreios() "+ getCep());
		
		if(getCep() == null || getCep() == ""){
			String titulo = "Campo CEP: ";
			String msg = PropertiesLoaderImpl.getValor("tErroCep");
			message.sendErrorMessageToUser(msg,"");
			
			try {
				FacesContext.getCurrentInstance().getExternalContext().redirect("../admin/cadRestauranteFilial.jsf");
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		else{
			enderecoWS = correioEJB.getEndereco(getCep());
			loginObj.gravarSessao("cep", getCep());
			System.out.println("CIDADE   "+ enderecoWS.getCidade());
			redirecionaPaginaCadFilial();
		}
	}


	public String getCep() {
		return cep;
	}


	public void setCep(String cep) {
		System.out.println("CEP passado "+ cep);
		this.cep = cep;
	}

	public Webservicecep getEnderecoWS() {
		return enderecoWS;
	}


	public void setEnderecoWS(Webservicecep enderecoWS) {
		this.enderecoWS = enderecoWS;
	}

/*================================================================================================================*/
	// Usuario Logger X Filial
	
	public List<RestauranteFilialWeb> filiaisSource() {
		int idRestaurante = (Integer) loginObj.getSessao("IDRestaurante");
		filiaisSource = filialEJB.findFilialByIDMatriz(idRestaurante);
		filiais = new DualListModel<RestauranteFilialWeb>(filiaisSource, filiaisTarget);
		return filiaisSource;
	}
		
	public List<RestauranteFilialWeb> getFiliaisSource() {
		return filiaisSource;
	}

	public List<RestauranteFilialWeb> getFiliaisTarget() {
		return filiais.getTarget();
	}

	public void setFiliaisTarget(List<RestauranteFilialWeb> filiaisTarget) {
		this.filiaisTarget = filiaisTarget;
	}

	public DualListModel<RestauranteFilialWeb> getFiliais() {
		filiaisSource();
		return filiais;
	}


	public void setFiliais(DualListModel<RestauranteFilialWeb> filiais) {
		this.filiais = filiais;
	}
	
/*===================================== SET ENTITY PERSISTE ================================================ */ 
		
	
	public RestauranteFilialWeb getFilialEntity() {
		return filialEntity;
	}

	public void setFilialEntity(RestauranteFilialWeb filialEntity) {
		this.filialEntity = filialEntity;
	}
	


	public RestauranteFilialEnderecoWeb getFilialEnderecoEntity() {
		return filialEnderecoEntity;
	}

	public void setFilialEnderecoEntity(
			RestauranteFilialEnderecoWeb filialEnderecoEntity) {
		this.filialEnderecoEntity = filialEnderecoEntity;
	}

	public RestauranteFilialJuridicoWeb getFilialJuridicoEntity() {
		return filialJuridicoEntity;
	}

	public void setFilialJuridicoEntity(
			RestauranteFilialJuridicoWeb filialJuridicoEntity) {
		this.filialJuridicoEntity = filialJuridicoEntity;
	}

	public RestauranteFilialInfraestruturaWeb getFilialInfraEntity() {
		return filialInfraEntity;
	}

	public void setFilialInfraEntity(
			RestauranteFilialInfraestruturaWeb filialInfraEntity) {
		this.filialInfraEntity = filialInfraEntity;
	}


	public RestauranteCulinariaSy getCulinariaEntity() {
		return culinariaEntity;
	}

	public void setCulinariaEntity(RestauranteCulinariaSy culinariaEntity) {
		this.culinariaEntity = culinariaEntity;
	}

	public RestauranteTipoSy getTipoEntity() {
		return tipoEntity;
	}

	public void setTipoEntity(RestauranteTipoSy tipoEntity) {
		this.tipoEntity = tipoEntity;
	}

	public RestauranteServicoSy getServicoEntity() {
		return servicoEntity;
	}

	public void setServicoEntity(RestauranteServicoSy servicoEntity) {
		this.servicoEntity = servicoEntity;
	}

	public RestauranteEstruturaSy getEstruturaEntity() {
		return estruturaEntity;
	}

	public void setEstruturaEntity(RestauranteEstruturaSy estruturaEntity) {
		this.estruturaEntity = estruturaEntity;
	}

	public RestauranteSedeWeb getSedeEntity() {
		return sedeEntity;
	}

	public void setSedeEntity(RestauranteSedeWeb sedeEntity) {
		this.sedeEntity = sedeEntity;
	}

	public InputText getInputTextCEP() {
		return inputTextCEP;
	}

	public void setInputTextCEP(InputText inputTextCEP) {
		this.inputTextCEP = inputTextCEP;
	}





 
}
